#pragma once

#include "net.hpp"
#include "message.hpp"

namespace gmrpc
{
    class Dispatcher
    {
    public:
    using ptr = std::shared_ptr<Dispatcher>;

    void registerHandler(MType mtype , MessageCallback& handler)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _handlers.insert(std::make_pair(mtype,handler));
    }

    void onMessage(const BaseConnection::ptr& conn,BaseMessage::ptr& msg)
    {
        //找到消息类型对应的业务处理函数，进行调用即可
        std::unique_lock<std::mutex> lock(_mutex);
        auto it= _handlers.find(msg->mtype());
        if(it != _handlers.end())
        {
            it->second(conn,msg);
        }
        //没有找到指定类型的处理函数--因为客户端和服务器都是我们自己设计的，因此不可能出现这种情况
        ELOG("收到未知类型的消息！");
        conn->shutdown();
    }

    private:
        std::mutex _mutex;
        std::unordered_map<MType, MessageCallback> _handlers;
    };
}